查看原文
其他

一种找漏洞触发位置的思路

陈chenwei 看雪学院 2019-05-26

本贴非常的基础,但是对于我这个刚刚弄漏洞的小白来说,还是颇费了一番周折,自认为比较通用,所以发出来给像我这样的新手朋友一点借鉴,大佬直接飘过。

思路:

首先确定shellcode的位置,然后找最近一层的堆栈调用,不是用od中的k,是堆栈窗口中的堆栈数据。堆栈覆盖可能覆盖的不止一层,所以看k是没啥用的。然后跟到调用的位置,这时堆栈还没有被覆盖,数据也没有被破坏。

一、先确定大概漏洞触发位置,利用od里面的自动步过,只要有跳到shellcode的地方就把那个地方下断点,然后从那个位置继续步过。这样经过几个来回,基本就能确定漏洞触发的大概位置了,然后再来确定是哪一条触发的。

二、漏洞触发的现象是某个函数覆盖了堆栈的值,所以思路就是下写入断点。

一般在漏洞触发后,堆栈中的数据被设置好了,返回地址也会返回到rop链,观察是哪一层返回地址发生了变化,导入到rop链上了,直接对这个位置下写入断点,然后就可以准确的确定是哪行导致了漏洞触发。


以cve-2010-0188为例:

测试环境:

xp sp3 专业版+adobe 9.3.0EN

找了个验证poc,漏洞触发会弹出计算器,为了便于调试,手工把随机基址关掉

对winexec下断点,加载pdf,会断下来。

此时OD中的K窗口:

因为堆栈数据被破坏,所以看到的回溯也是错的。

直接看堆栈窗口的数据:

缓冲区溢出往往只是破坏某一个或者几个栈帧的返回地址,而不会对整个栈帧破坏,所以查看临近的栈调用是可行的。

跟随最近的调用,并下好断点:

然后我们重新载入,打开pdf。

f9运行之后,会断到20BA8252,利用OD的自动步过(Ctrl+F8),这里如果用自动步入,会走很多函数,很难等到我们要的函数。

我们先大致确定漏洞触发的范围,然后再对关键部分进行步入跟进。

由于在winexec位置还是有断点,自动步过之后会断到那个位置,我们用键盘的减号“-”返回,查看是哪个函数调用跳到winexec上的。

找到20BA719E处的调用,跳到目标函数,我们在这个函数调用里面下好断点,然后再次载入,运行之后,F9再次来到我们刚刚下好断点的位置。

同样的,当断到winexec时,用减号回放。

依然在函数调用里面下好断点,然后重新载入。

重复这个过程多次之后,我们可以发现函数的调用越来越深入,甚至连rop链都已经跟出来了。

下面这个跳转之后返回,就返回到rop链上了。

既然都能跟到rop链(至于rop链的判断完全凭经验,一般都是小零件一样的汇编代码,不是成片的),说明漏洞已经触发,构造好的数据已经被写入到堆栈中了。

下面,我们来找漏洞触发的具体位置。

本来这一系列函数地址都是AcroForm模块中的调用,返回地址也是这个模块的,所以我就找到了跳往rop链的地址作为突破口(这里只要是自己确定的数据被修改了都是可以,也可以用没有问题的pdf文件打开作为对比)。

在函数20CB59A0被调用前,返回地址是正常的。

调用之后,返回地址被修改为了rop链地址了。

接下来对这个地址下硬件写入断点。

f9运行之后会断到写入的位置。

这时我们就可以通过堆栈回溯找到对应的调用关系了。


看雪ID:陈chenwei

bbs.pediy.com/user-722470



本文由看雪论坛 陈chenwei 原创

转载请注明来自看雪社区





热门技术文章推荐:





戳原文,看看大家都是怎么说的?

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存